﻿#define _CRT_SECURE_NO_WARNINGS 1
//给定两个数组nums1和nums2，返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序
//#include<stdio.h>
//#include<stdlib.h>
//
//void Print(int* num, int sz)
//{
//    for (int i = 0; i < sz; i++)
//    {
//        printf("%d ", num[i]);
//    }
//    printf("\n");
//}
//
//int cmp(const void* p1, const void* p2)
//{
//    return (*(int*)p1 - *(int*)p2);
//}
//
//int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) 
//{
//    qsort(nums1, nums1Size, sizeof(int), cmp);
//    qsort(nums2, nums2Size, sizeof(int), cmp);
//    int i = 0;
//    int begain1 = 0;
//    int begain2 = 0;
//    int* NewArray = (int*)malloc(sizeof(int) * nums1Size);
//    if (NewArray == NULL)
//    {
//        perror("malloc fail");
//        return -1;
//    }
//
//    while (begain1 < nums1Size && begain2 < nums2Size)
//    {
//        if (nums1[begain1] < nums2[begain2])
//        {
//            begain1++;
//        }
//        else if (nums1[begain1] > nums2[begain2])
//        {
//            begain2++;
//        }
//        else
//        {
//            if (i == 0 || NewArray[i - 1] != nums1[begain1])
//            {
//                NewArray[i] = nums1[begain1];
//                i++;
//            }
//            begain1++;
//            begain2++;
//        }
//    }
//    *returnSize = i;
//
//    return NewArray;
//}
//
//int main()
//{
//    int numArr[] = { 1,4,3,5,2,9,6,7,0 };
//    int numArr2[] = { 2, 4,3,7,5 };
//    int sz1 = sizeof(numArr) / sizeof(numArr[0]);
//    int sz2 = sizeof(numArr2) / sizeof(numArr2[0]);
//    int size = 0;
//    //查找相同元素
//    int* ret = intersection(numArr, sz1, numArr2, sz2, &size);
//    //打印相同元素
//    Print(ret, size);
//    free(ret);
//    ret = NULL;
//
//	return 0;
//}
//将字符串按照ASCII码值的大小,由小到大排好
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//
//int cmp(const void* p1, const void* p2)
//{
//    return (*(char*)p1 - *(char*)p2);
//}
//
//int main() {
//    char str[1001];
//    while (scanf("%s", str) != -1) {
//        int sz = strlen(str);
//        qsort(str, sz, sizeof(char), cmp);
//        printf("%s\n", str);
//    }
//    return 0;
//}
//给你一个整数数组nums，请计算数组的中心下标。数组中心下标是数组的一个下标，
//其左侧所有元素相加的和等于右侧所有元素相加的和。
//如果中心下标位于数组最左端，那么左侧数之和视为0 ，
//因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
//如果数组有多个中心下标，应该返回最靠近左边的那一个。如果数组不存在中心下标，返回-1 。
//#include <stdio.h>
//
//int pivotIndex(int* nums, int numsSize) {
//    if (numsSize == 1)
//        return 0;
//    for (int i = 0; i < numsSize; i++)
//    {
//        int left_tmp = 0;
//        int right_tmp = 0;
//        for (int j = 0; j < i; j++)
//        {
//            if (i == 0)
//            {
//                left_tmp = 0;
//            }
//            else
//            {
//                left_tmp += nums[j];
//            }
//        }
//        for (int j = i + 1; j < numsSize; j++)
//        {
//            if (i == numsSize - 1)
//            {
//                right_tmp = 0;
//            }
//            else
//                right_tmp += nums[j];
//        }
//        if (left_tmp == right_tmp)
//        {
//            return i;
//        }
//    }
//    return -1;
//}
//
//int main()
//{
//    int arr[] = { 1,7,3,6,5,6 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int ret = pivotIndex(arr, sz);
//    printf("%d\n", ret);
//
//    return 0;
//}
//编写一个函数，计算字符串中含有的不同字符的个数。
//字符在ASCII码范围内(0~127，包括0和127)，换行表示结束符，不算在字符里。
//不在范围内的不作统计。多个相同的字符只计算一次
//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
//
//int cmp(const void* p1, const void* p2)
//{
//    return (*(char*)p1 - *(char*)p2);
//}
//
//int main() {
//    char str[501];
//    int count = 0;
//    while (scanf("%s", str) != -1) {
//        int sz = strlen(str);
//        qsort(str, sz, sizeof(char), cmp);
//        for (int i = 0; i < sz - 1; i++)
//        {
//            if (str[i] != str[i + 1])
//                count++;
//        }
//        printf("%d\n", count + 1);
//    }
//    return 0;
//}
//给定一个大小为 n 的数组，找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋的元素。
//你可以假设数组是非空的，并且给定的数组总是存在多数元素。
//#include <stdio.h>
//
//int majorityElement(int* nums, int numsSize)
//{
//    int count = 0;
//    int tmp = 0;
//    for (int i = 0; i < numsSize; i++)
//    {
//        if (nums[i] == tmp)
//        {
//            count++;
//        }
//        else if (count == 0)
//        {
//            tmp = nums[i];
//        }
//        else
//        {
//            count--;
//        }
//    }
// 
//    return tmp;
//}
//
//int main()
//{
//    int arr[] = { 3,2,3 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int ret = majorityElement(arr, sz);
//    printf("%d\n", ret);
//
//    return 0;
//}
//自除数是指可以被它包含的每一位数整除的数。
//例如,128是一个自除数,因为128%1 == 0,128 % 2 == 0,128 % 8 == 0.
//自除数不允许包含0。
//给定两个整数left和right,返回一个列表,列表的元素是范围[left,right]内所有的自除数。
//#include <stdio.h>
//#include <stdlib.h>
//#include <stdbool.h>
//#include <assert.h>
//
//bool isSelfDevi(int num)
//{
//    int tmp = num;
//    while (tmp)
//    {
//        if (tmp % 10 == 0 || num % (tmp % 10) != 0)
//        {
//            return false;
//        }
//        tmp = tmp / 10;
//    }
//
//    return true;
//}
//
//int* selfDividingNumbers(int left, int right, int* returnSize) {
//    int position = 0;
//    int* NewArr = (int*)malloc(sizeof(int) * (right - left + 1));
//    assert(NewArr);
//    for (int i = left; i <= right; i++)
//    {
//        if (isSelfDevi(i))
//            NewArr[position++] = i;
//    }
//    *returnSize = position;
//    return NewArr;
//}
//
//int main()
//{
//    int left = 0;
//    int right = 0;
//    int sz = 0;
//    while (scanf("%d %d", &left, &right) != EOF)
//    {
//        int* ret = selfDividingNumbers(left, right, &sz);
//        for (int i = 0; i < sz; i++)
//        {
//            printf("%d ", ret[i]);
//        }
//        printf("\n");
//        free(ret);
//        ret = NULL;
//    }
//
//    return 0;
//}